\section{用SageMath计算举例}
\begin{frame}{计算系统 SageMath}

常用的科学计算软件有：Matlab, Mathematica, Maple等。这些都是收费的商业软件。
如果你有用这些软件的需求，可以自己查查官方提供的文档。
这里推荐一个免费的软件：SageMath. 这个集合了许多优秀的开源项目。
SageMath的官网是 \url{https://www.sagemath.org/}.
官网有安装教程； MacOS和Linux系统安装很方便，
Windows系统需要通过wsl安装Ubuntu系统后安装；
另外，老版的 SageMath 9 提供了安装包 (故不必通过 wsl 安装)，网址： 
\url{https://mirrors.mit.edu/sage/win/SageMath-9.3-Installer-v0.6.3.exe}
官网不仅有各组件的文档，而且提供了一些入门的参考书，如 sagebook (网址：
\url{http://dl.lateralis.org/public/sagebook/sagebook-ba6596d.pdf})
要把Sage的运行结果转成latex,
可以调用 \mintinline{python}{latex()} 函数实现。


\end{frame}

\begin{frame}[fragile]
  \frametitle{基本算术}
在介绍如何用SageMath来做本章中的运算之前，我们先介绍点基本的算术。

~

四则运算：

\begin{minted}[texcl]{sage}
sage: 2+3  # 求和 $2+3$
5
sage: 2-3  # 求差 $2-3$
-1
sage: 2*3  # 乘积 $2\times 3$
6
sage: 2/3  # $2/3$ 
2/3
sage: 2/3+5/3+3/2  # 求和 $2/3+5/3+3/2$
23/6
sage: 7//3  # 求 (部分) 商， $7$除以$3$的整数部分
2
sage: 7%3  # 求 $7$除以$3$的余数
1
sage: divmod(7,3)  # 带余除法（同时求 (部分) 商和余数）
(2, 1)
\end{minted}

\end{frame}

\begin{frame}[fragile]
指数对数运算：

\begin{minted}[texcl]{sage}
sage: 2^3  # 求 $2^3$
8
sage: 2**3  # 求 $2^3$
8
sage: 2^(1/2)  # $2^{1/2}$
sqrt(2)
sage: sqrt(-2)  # $\sqrt{-2}$
sqrt(-2)
sage: sqrt(-2)^3+1  # 求 $\sqrt{-2}^3+1$ 
-2*sqrt(-2) + 1
sage: (2.0)^(1/2)  # 求$2^{1/2}$的近似值
1.41421356237310
sage: numerical_approx(sqrt(2))  # 求$2^{1/2}$的近似值
1.41421356237310
sage: 2^(1/3)  # $2^{1/3}$
2^(1/3)
sage: log(5,2)  # $\log_2 5$
log(5)/log(2)
sage: log(5.0,2)  # 求 $\log_2 5$ 的近似值
2.32192809488736
sage: numerical_approx(log(5,2))  # 求 $\log_2 5$ 的近似值
2.32192809488736
\end{minted}
\end{frame}

\begin{frame}[fragile]
整数的$m$-进制展开：

\begin{minted}[texcl]{sage}
sage: 10.digits(base=2)  # $10$的二进制展开：$10 = 2^1 + 2^3$
[0, 1, 0, 1]
sage: 121.digits(base=5)  # $121$的二进制展开：$121 = 1 + 4\times 5 + 4\times 5^2$
[1, 4, 4]
\end{minted}

~

更多：

\begin{minted}[texcl]{sage}
sage: abs(-2)  # 求绝对值
2
sage: floor(sqrt(101))  # 求不大于$\sqrt{101}$ 的整数
10
sage: ceil(sqrt(101))  # 求不小于$\sqrt{101}$的整数
11
sage: factorial(10)  # 求阶乘 $10!$
3628800
sage: 10.binomial(2)  # 求组合数 $\binom{10}{2}$
45
\end{minted}

\end{frame}

\begin{frame}[fragile]
  \frametitle{加减乘除}

基本的多项式的算术：

  \begin{minted}[texcl]{python}
sage: R.<x> = QQ[] # 定义基域是有理数域变元为 $x$ 的一元多项式环 $\bQ[x]$
sage: f = x^5 + 2*x^4 - 2*x^3 - 8*x^2 -7*x -2  # 定义 $f=x^5 + 2x^4 - 2x^3 - 8x^2 -7x -2 $
sage: g=x^4+2*x+5; h=x^3 + 2*x^2 - 1  # 定义 $g, h$
sage: g+h  # 求$g+h$
x^4 + x^3 + 2*x^2 + 2*x + 4
sage: g-h  # 求$g-h$
x^4 - x^3 - 2*x^2 + 2*x + 6
sage: g*h  # 求$gh$
x^7 + 2*x^6 + x^4 + 9*x^3 + 10*x^2 - 2*x - 5
sage: h^2  # 求$h^2$
x^6 + 4*x^5 + 4*x^4 - 2*x^3 - 4*x^2 + 1
sage: f // g  # $f$ 除以 $g$ 的 (部分) 商
x + 2
sage: f % g  # $f$ 除以 $g$ 的余式
-2*x^3 - 10*x^2 - 16*x - 12
sage: divmod(f, g)  # 带余除法的 (部分) 商和余
(x + 2, -2*x^3 - 10*x^2 - 16*x - 12)
sage: h.subs(x=x+3).coefficients()  # 计算 $h(x+3)$的系数
[44, 39, 11, 1]
sage: # 故$h$在$3$处的Taylor展开为 $h(x)=44+39(x-3)+11(x-3)^2+(x-3)^3$
\end{minted}

\end{frame}

\begin{frame}[fragile]


我们也可以在其他基域上计算：

\begin{minted}[texcl]{sage}
sage: # 如下定义包含$i=\sqrt{-1}$和$2$的三次单位根的最小的数域
sage: # $2$的三次单位根有三个，cuberoot2 可表其中任意一个
sage: R.<x>=QQ[]
sage: K.<i,cuberoot2> = NumberField([x^2+1, x^3 - 2])  
sage: f=x^3 - i*x^2 + cuberoot2*x - cuberoot2*i
sage: g=x^4 - i*x^3 - 2*cuberoot2*x^2 + ((2*cuberoot2 + 1)*i)*x + 1
sage: divmod(g,f)
(x, -3*cuberoot2*x^2 + ((3*cuberoot2 + 1)*i)*x + 1)
sage: f.gcd(g)  # 求首一最大公因子 $(f,g)$
x - i
sage: f.is_irreducible()
False
sage: f.factor()
(x - i) * (x^2 + cuberoot2)
\end{minted}

 
\end{frame}

\begin{frame}[fragile]
  \frametitle{最大公因子、最小公倍}
Sage提供了方法分解多项式，求最大公因子、最小公倍:
先如上页定义好$f,g,h$三个多项式：
\begin{minted}[texcl]{sage}
sage: R.<x> = QQ[] # 定义基域是有理数域变元为 $x$ 的一元多项式环 $\bQ[x]$
sage: f = x^5 + 2*x^4 - 2*x^3 - 8*x^2 -7*x -2
sage: g=x^4+2*x+5
sage: h=x^3 + 2*x^2 - 1
\end{minted}


求$f, g$的首一最大公因子：
\begin{minted}[texcl]{python}
sage: f.gcd(g)  # 求$(f,g)$
1
\end{minted}

找到$f,h$的首一最大公因子$(f,h)$，
并把$(f,h)$表示成$f,h$的多项式系数的线性组合：
\begin{minted}[texcl]{python}
sage: f.xgcd(h)  # 求$(f,h)$并找B\'ezout等式$(f,h)=uf+vg$中的$u, v$
[x + 1, -3/5*x + 1/5, 3/5*x^3 - 1/5*x^2 - 6/5*x - 7/5)
sage: print("(f,h) 为 \n%s = (%s)*f + (%s)*h" % f.xgcd(h))
(f,h) 为
x + 1 = (-3/5*x + 1/5)*f + (3/5*x^3 - 1/5*x^2 - 6/5*x - 7/5)*h
\end{minted}

\end{frame}

\begin{frame}[fragile]{不可约性、因子分解、根}
  判断$f,g$是否不可约：
\begin{minted}[texcl]{python}
sage: f.is_irreducible(); g.is_irreducible()
False
True
\end{minted}

对$f,g,h$做因式分解：
\begin{minted}[texcl]{python}
sage: f.factor(); g.factor(); h.factor()
(x - 2) * (x + 1)^4
x^4 + 2*x + 5
(x + 1) * (x^2 + x - 1)
\end{minted}



找$f$的所有有理根及其重数、
找$h$的所有实根及其重数、
找$g$的所有复根及其重数：
\begin{minted}[texcl]{python}
sage: f.roots()  # 求 $f$ 在系数域上的根，$2$为$1$重根，$-1$为$4$重根
[(2, 1), (-1, 4)]
sage: h.roots(RR)
[(-1.61803398874989, 1), 
(-1.00000000000000, 1), 
(0.618033988749895, 1)]
sage: g.roots(CC)
[(-1.06875725526065 - 0.821224079816004*I, 1),
(-1.06875725526065 + 0.821224079816004*I, 1),
(1.06875725526065 - 1.26888736776551*I, 1),
(1.06875725526065 + 1.26888736776551*I, 1)]
\end{minted}
 
\end{frame}

\begin{frame}[fragile]{重因子、重根}


判断$g$可有重因子：
\begin{minted}[texcl]{python}
sage: print('g 无重因子' if g.gcd(g.differentiate()) == 1 \
....: else 'g 有重因子')
g 无重因子
\end{minted}

找$f$的重因子：
\begin{minted}[texcl]{sage}
sage: f.gcd(f.differentiate()).factor()
(x + 1)^3
\end{minted}
既然算出$f, f'$的首一最大公因子的因子分解为$(x+1)^3$, 
首一不可约多项式中只有$x+1$是$f$的重因子，
且是$4$重的。从而$f$有一个$4$重的重根$-1$.

~


  我们也可通过赋值计算重数。
对多项式$f$和不可约多项式$p$, 求$p$在$f$中的重数$v_p(f)$:

\begin{minted}[texcl]{sage}
sage: K.<x> = FunctionField(QQ)  # 定义函数域 $\bQ(x)$
sage: v=K.valuation(x^2 + 1)  # 定义不可约多项式 $x^2+1$ 定义的赋值
sage: f = x^5 - x^4 + 2*x^3 - 2*x^2 + x - 1
sage: v(f)  # 求 $x^2+1$ 在 $f$中的重数
2
sage: f.factor()  # 通过分解 $f$ 来验证
(x^2 + 1)^2 * (x - 1)
\end{minted}
\end{frame}

\begin{frame}[fragile]
  若数域上的$n$次多项式$f$的$n$个复根为$x_1,\cdots,x_n$ (重根按重数计入), 则$f$的判别式定义为
  \[
    \disc(f)=\prod_{i<j}(x_i-x_j)^2=(-1)^{\frac{n(n-1)}{2}}\prod_{i\neq j}(x_i-x_j)^2.
  \]
  这是关于$x_1,\cdots,x_n$的对称多项式。
  由对称多项式的理论可知$\disc(f)$落在系数域中。
  显然$f$在复数域中有重根当且仅当$f$的判别式等于$0$.
因此，我们可以通过计算判别式来知晓$f$何时有重根。

\begin{minted}[texcl]{sage}
sage: V.<p,q>=QQ[]  # 定义有理数域上的二元多项式环$V=\bQ[p,q]$, $p,q$将作为参数
sage: R.<x>=V[]  # 定义系数环为$V$的一元多项式环$V[x]$
sage: f=x^2+p*x+q  
sage: f.discriminant()  # 计算 $f$ 的判别式
p^2 - 4*q
sage: f=x^3+p*x+q
sage: f.discriminant()  # 计算 $f$ 的判别式
-4*p^3 - 27*q^2
\end{minted}

既然$\disc(x^2+px+q)=p^2-4q$, $x^2+px+q$在$\bC$中有重根当且仅当$p^2-4q=0$;
既然$\disc(x^3+px+q)=-4p^3-27q^2$, $x^3+px+q$在$\bC$中有重根当且仅当$4p^3+27q^2=0$.
\end{frame}
